#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
    Errorcodes:
    1 - erro de uso
    2 - porta inválida
    3 - falha de comunicação com o OpenOffice.Org
"""

import sys
import getopt
from PenPresenter.openoffice import single_oo
import SocketServer

class PenServer:
    def __init__(self):
        self.porta = 1987
        self.p1 = (0, 0)
        self.p2 = (640, 480)

    def uso(self):
        print """
Uso:
%s <[-p porta | --porta=porta]> [--p1x=<num> --p1y=<num> --p2x=<num> --p2y=<num>] stdin
onde porta é um número entre 1024 e 65535 utilizado na comunicação,
     p1x e p1y são as coordenadas do ponto superior esquerdo da tela de projeção
     p2x e p2y são as coordenadas do ponto inferior direito da tela de projeção
""" % sys.argv[0]

    def converterNDC(self, p):
        """
        As coordenadas do ponto recebido já levam em consideração
        o translado do sistema de coordenadas para o limite
        superior esquerdo.
        """
        x = (float(p[0]) - self.p1[0])/ (self.p2[0] - self.p1[0])
        y = (float(p[1]) - self.p1[1])/ (self.p2[1] - self.p1[1])
        return (float(x),float(y))

    def preparar(self):
        try:
            long_opts = ["porta=", "p1x=", "p1y=", "p2x=", "p2y="]
            opts,args = getopt.getopt(sys.argv[1:], "p:", long_opts)
        except getopt.GetoptError, err:
            self.uso()
            print "Erro ... %s" % str(err)
            sys.exit(1)
        #Verificando número da porta
        alteracao = [x for x in opts if x[0] in ("-p", "--porta") and x[1].isdigit()]
        if len(alteracao)==2:
            print "Os argumentos -p e --porta não devem ser usados simultaneamente!"
            sys.exit(1)
        elif len(alteracao)==1:
            self.porta = int(alteracao[0][1])
        if self.porta < 1024 or self.porta > 65535:
            print "Porta inválida! Utilize um número entre 1024 e 65535."
            sys.exit(2)
        #Verificando limites de calibração
        p1x = p1y = p2x = p2y = None
        for x in opts:
            if x[0] == '--p1x':
                p1x = int(x[1])
            elif x[0] == '--p1y':
                p1y = int(x[1])
            elif x[0] == '--p2x':
                p2x = int(x[1])
            elif x[0] == '--p2y':
                p2y = int(x[1])
        if p1x and p1y:
            self.p1 = (p1x, p1y)
        if p2x and p2y:
            self.p2 = (p2x, p2y)
        #Tentando conectar
        rc = single_oo.conectar(self.porta)
        if not rc:
            print "Falha ao estabelecer a comunicação com o OpenOffice.Org"
            print "Porta utilizada: %s" % self.porta
            sys.exit(3)
    def iniciar(self):
        while True:
            coordenadas = sys.stdin.readline()
            if not coordenadas:
                break
            else:
                c = coordenadas[:-1].split(",")
                x,y = self.converterNDC((int(c[0]), int(c[1])))
                single_oo.laserRecebido(x,y)
        print "Encerrando penserver..."
        sys.exit(0)

if __name__ == "__main__":
    print """
=========
PenServer
=========
"""
    app = PenServer()
    app.preparar()
    app.iniciar()
